﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Text.RegularExpressions;
using skhukb.BL;
using skhukb.DB;
using skhukb.Models;

namespace skhukb.Controllers
{
    [Authorize]
    public class ArticleController : Controller
    {
        [HttpGet]
        public ActionResult New(long ID)
        {
            return View("Edit", new 글Model { 주제ID = ID });
        }

        [HttpGet]
        public ActionResult Edit(long ID)
        {
            using (var db = new DBDataContext()) {
                var 글 = db.글.FirstOrDefault(p => p.ID == ID);
                if (글 == null) return HttpNotFound(Consts.글없음);
                return View(new 글Model(글, 내용포함: true));
            }
        }

        [HttpPost]
        [ValidateInput(false)]
        public ActionResult Save(글Model 모델) // referenced by Edit.cshtml
        {
            if (String.IsNullOrEmpty(모델.제목)) return Json(new JsonModel { success = false, message = Consts.제목오류 });
            if (String.IsNullOrEmpty(모델.내용)) return Json(new JsonModel { success = false, message = Consts.내용오류 });
            using (var db = new DBDataContext()) {
                글 새글 = 모델.to글();
                새글.상태 = Consts.최신버전;
                새글.작성자ID = 현재사용자.사용자.ID;
                새글.생성일 = DateTime.Now; 
                새글.편집유형 = Consts.글편집;

                var 동일주제글목록 = db.글.Where(p => p.주제ID == 모델.주제ID);
                var 동일코드글목록 = db.글.Where(p => p.주제ID == 모델.주제ID && p.코드 == 모델.코드);
                if (모델.코드 == 0) { // 새 글 쓰기
                    새글.코드 = (동일주제글목록.Count() == 0) ? 1 : (1 + 동일주제글목록.Max(p => p.코드));
                    새글.순서 = (동일주제글목록.Count() == 0) ? 1 : (1 + 동일주제글목록.Max(p => p.순서));
                } else { // 글 버전 업
                    foreach (var 기존최신글 in 동일코드글목록.Where(p => p.상태 == Consts.최신버전))
                        기존최신글.상태 = Consts.구버전;
                    var 기존글 = 동일코드글목록.FirstOrDefault();
                    새글.순서 = (기존글 == null) ? 1 : 기존글.순서;
                }
                db.글.InsertOnSubmit(새글);
                db.SubmitChanges();
                이미지첨부정보_저장(db, 새글);
                return Json(new JsonModel { success = true, url = Url.SubjectDetail(모델.주제ID) });
            }
        }

        private static void 이미지첨부정보_저장(DBDataContext db, 글 글)
        {
            Regex 찾을패턴 = new Regex(@"/Image/Download/([0-9]+)");
            var 찾은목록 = 찾을패턴.Matches(글.내용);
            foreach (Match match in 찾은목록) {
                var id = long.Parse(match.Groups[1].Value);
                db.이미지첨부.InsertOnSubmit(new 이미지첨부 { 글ID = 글.ID, 이미지ID = id });
            }
            db.SubmitChanges();
        }

        [HttpGet]
        public ActionResult History(long ID)
        {
            using (var db = new DBDataContext()) {
                var 글 = db.글.FirstOrDefault(p => p.ID == ID);
                if (글 == null) return HttpNotFound(Consts.글없음);
                var 글목록 = db.글.Where(p => p.주제ID == 글.주제ID && p.코드 == 글.코드).OrderByDescending(p => p.생성일).Select(p => new 글Model(p, true)).ToList();
                var 최신글 = 글목록.FirstOrDefault(p => p.상태 == Consts.최신버전) ?? 글목록.FirstOrDefault(p => p.ID == 글.ID);
                var 주제 = new 주제Model(글.주제);
                return View(new ArticleHistoryModel { 주제 = 주제, 최신글 = 최신글, 글목록 = 글목록 });
            }
        }

        [HttpPost] [skhukb.Util.AjaxOnly]
        public ActionResult SetTop(long ID) // referenced by History.cshtml
        {
            using (var db = new DBDataContext()) {
                var 글 = db.글.FirstOrDefault(p => p.ID == ID && p.편집유형 == Consts.글편집);
                if (글 == null) return Json(new JsonModel { success = false, message = Consts.글없음 });

                foreach (var 이전글 in db.글.Where(p => p.주제ID == 글.주제ID && p.코드 == 글.코드 && p.상태 == Consts.최신버전))
                    이전글.상태 = Consts.구버전;
                글.상태 = Consts.최신버전;

                글변경내역.최신글선택(db, 글);
                db.SubmitChanges();
                return Json(new JsonModel { success = true, url = Url.ArticleHistory(글.ID) });
            }
        }

        [skhukb.Util.AjaxOnly] [HttpPost]
        public ActionResult Delete(long ID)
        {
            using (var db = new DBDataContext()) {
                var 글 = db.글.FirstOrDefault(p => p.ID == ID);
                if (글 == null) return Json(new JsonModel { success = false, message = Consts.글없음 });

                글.상태 = Consts.제거상태의최신버전;

                주제변경내역.글제거(db, 글);
                db.SubmitChanges();

                return Json(new JsonModel { success = true, url = Url.SubjectDetail(글.주제ID) });
            }
        }

        [skhukb.Util.AjaxOnly] [HttpPost]
        public ActionResult Undelete(long ID)
        {
            using (var db = new DBDataContext()) {
                var 글 = db.글.FirstOrDefault(p => p.ID == ID);
                if (글 == null) return Json(new JsonModel { success = false, message = Consts.글없음 });

                글.상태 = Consts.최신버전;

                주제변경내역.글제거취소(db, 글);
                db.SubmitChanges();

                return Json(new JsonModel { success = true, url = Url.SubjectDetail(글.주제ID) });
            }
        }

        [HttpPost] [skhukb.Util.AjaxOnly]
        [Authorize(Roles = MyRoleProvider.ADMIN)]
        public ActionResult DeleteFromDB(long ID) // referenced by History.cshtml
        {
            using (var db = new DBDataContext()) {
                var 글 = db.글.FirstOrDefault(p => p.ID == ID);
                if (글 == null) return Json(new JsonModel { success = false, message = Consts.글없음 });

                if (글.상태 == Consts.최신버전) {
                    var 다음글 = db.글.Where(p => p.주제ID == 글.주제ID && p.코드 == 글.코드 && p.상태 == Consts.구버전 && p.편집유형 == Consts.글편집).OrderByDescending(p => p.생성일).FirstOrDefault();
                    if (다음글 != null) 다음글.상태 = Consts.최신버전;
                }
                db.이미지첨부.DeleteAllOnSubmit(글.이미지첨부);                
                db.글.DeleteOnSubmit(글);
                db.SubmitChanges();

                var 아무글 = db.글.FirstOrDefault(p => p.주제ID == 글.주제ID && p.코드 == 글.코드);
                if (아무글 == null) return Json(new JsonModel { success = true, url = Url.SubjectDetail(글.주제ID) });
                return Json(new JsonModel { success = true, url = Url.ArticleHistory(아무글.ID) });
            }
        }

        [HttpPost] [skhukb.Util.AjaxOnly]
        public ActionResult SetComCenterOnly(long ID, bool value) // referenced by _Detail.cshtml
        {
            using (var db = new DBDataContext()) {
                var 글 = db.글.FirstOrDefault(p => p.ID == ID && p.편집유형 == Consts.글편집);
                if (글 == null) return Json(new JsonModel { success = false, message = Consts.글없음 });

                foreach (var p in db.글.Where(p => p.주제ID == 글.주제ID && p.코드 == 글.코드))
                    if (p.전산소만 != value) p.전산소만 = value;

                db.SubmitChanges();
                return Json(new JsonModel { success = true, url = Url.SubjectDetail(글.주제ID) });
            }
        }

        [HttpPost]
        [skhukb.Util.AjaxOnly]
        public ActionResult Move(long ID, long subjectID)
        {
            using (var db = new DBDataContext()) {
                var 글 = db.글.FirstOrDefault(p => p.ID == ID);
                if (글 == null) return Json(new JsonModel { success = false, message = Consts.글없음 });
                if (글.주제ID == subjectID) return Json(new JsonModel { success = false, message = Consts.이동불가 });

                var 이전주제 = 글.주제;
                var 이전코드 = 글.코드;

                var 새주제 = db.주제.FirstOrDefault(p => p.ID == subjectID);
                if (새주제 == null) return Json(new JsonModel { success = false, message = Consts.주제없음 });
                var 새코드 = (새주제.글.Count() == 0) ? 1 : 1 + 새주제.글.Max(p => p.코드);
                var 새순서 = (새주제.글.Count() == 0) ? 1 : 1 + 새주제.글.Max(p => p.순서);

                foreach (var p in db.글.Where(p => p.주제ID == 글.주제ID && p.코드 == 글.코드)) {
                    p.주제 = 새주제;
                    p.코드 = 새코드;
                    p.순서 = 새순서;
                }
                foreach (var a in db.파일첨부.Where(p => p.주제ID == 이전주제.ID && p.글코드 == 이전코드)) {
                    a.주제ID = 새주제.ID;
                    a.글코드 = 새코드;
                }

                주제변경내역.글이동(db, 이전주제, 새주제, 글);

                db.SubmitChanges();
                return Json(new JsonModel { success = true, url = Url.SubjectDetail(새주제.ID) });
            }
        }

    }
}
